package com.czxy.controller;

import com.aliyuncs.exceptions.ClientException;
import com.czxy.pojo.User;
import com.czxy.pojo.group.BaseResult;
import com.czxy.service.UserService;
import com.czxy.util.GetRandomCodeUtil;
import com.czxy.util.SmsUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @author Liuyunqin 17674029449@163.com
 * @date 2018/12/13 20:54
 */
@RestController
@RequestMapping
public class SmsController {

    /**
     * redis注入
     */
    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    /**
     * userService 服务类
     */
    @Autowired
    private UserService userService;

    /**
     * @author 刘韵琴  email:17674029449@163.com
     * @describe 发送短信
     */
    @PostMapping("/sms")
    public ResponseEntity<Object> sendSms(@RequestBody User user){
        //0. 封装条件
        Map<String,Object> map = new HashMap<>();
        System.out.println(user.getMobile());
        //1. 如果redis中的电话不为空
        String mobile = redisTemplate.opsForValue().get(user.getMobile());
        if (mobile!=null){
            //1.1 先判断redis中是否已经存在电话号码，不允许第二次发送
            BaseResult error = new BaseResult(1, "短信已经发送，不能再次操作！！！");
            map.put("data",error);
            return ResponseEntity.ok(map);
        }

        //1.2 先判断数据库电话号码是否存在，如果存在不能注册
        User userByMobile = userService.findMobile(user.getMobile());
        if (userByMobile!=null){
            BaseResult error = new BaseResult(1, "用户已经存在,发送短信失败！");
            map.put("data",error);
            return ResponseEntity.ok(map);
        }

        //2. 如果没有存在，就注册
        //2.1 获取随机验证码
        String code = GetRandomCodeUtil.getCode();
        //2.2 将电话号码和验证码以键值对方式保存至redis设置2分钟时效
        redisTemplate.opsForValue().set(user.getMobile(),code,2, TimeUnit.MINUTES);
        //2.3 发送短信
        try {
            SmsUtil.sendSms(user.getMobile(),code);
            System.out.println("验证码为："+code);
        } catch (ClientException e) {
            e.printStackTrace();
        }
        BaseResult success = new BaseResult(0, "发送短信成功！");
        map.put("data",success);
        return ResponseEntity.ok(map);
    }
    /**
     * @author 刘韵琴  email:17674029449@163.com
     * @describe 新增用户
     */
    @PostMapping("/regist")
    public ResponseEntity<Object> regist(@RequestBody User user){
        //0. 封装条件
        Map<String,Object> map = new HashMap<>();
        //0.1 判断如果用户输入的信息为空，不能注册，并提示信息
        if (user.getName()==null||user.getMobile()==null) {
            BaseResult baseResult = new BaseResult(1,"信息不能为空！");
            map.put("data",baseResult);
            return ResponseEntity.ok(map);
        }

        //1. 判断用户输入的code是否与redis存储的值一致
        String code = redisTemplate.opsForValue().get(user.getMobile());
        System.out.println("redis:"+code);
        if (!code.equals(user.getCode())) {
            BaseResult baseResult = new BaseResult(1,"注册失败，用户已经存在！");
            map.put("data",baseResult);
            return ResponseEntity.ok(map);
        }
        //2. 保存用户
        userService.saveUser(user);
        //2.1 删除redis中的信息
        redisTemplate.delete(user.getMobile());
        //3. 返回信息
        BaseResult baseResult = new BaseResult(0,"注册成功");
        map.put("data",baseResult);
        return ResponseEntity.ok(map);
    }

}
